#include "freestimulatepage.h"
#include "ui_freestimulatepage.h"
#include "serialmanager.h"
#include "commandhex.h"
#include <QDebug>
#include <QMessageBox>
#include <QTimer>
#include "stimulatehelper.h"

FreeStimulatePage::FreeStimulatePage(QWidget *parent): QWidget(parent), ui(new Ui::FreeStimulatePage)
{
    ui->setupUi(this);

    // 初始化数据
    initData();

    // 初始化信号和槽
    setupConnections();
}

/**
 * @brief 初始化数据
 */
void FreeStimulatePage::initData()
{
    // 初始化电流值
    m_currentA = 0;
    m_currentB = 0;
}

/**
 * 初始化信号和槽
 */
void FreeStimulatePage::setupConnections()
{
    // A通道 减少电流
    connect(ui->btnReduceA, &QPushButton::clicked, this, &FreeStimulatePage::onBtnReduceAClick);

    // A通道 增加电流
    connect(ui->btnIncreaseA, &QPushButton::clicked, this, &FreeStimulatePage::onBtnIncreaseAClick);

    // A通道 开始停止
    connect(ui->btnStartStopA, &QPushButton::clicked, this, &FreeStimulatePage::onBtnStartStopAClick);

    // B通道 减少电流
    connect(ui->btnReduceB, &QPushButton::clicked, this, &FreeStimulatePage::onBtnReduceBClick);

    // B通道 增加电流
    connect(ui->btnIncreaseB, &QPushButton::clicked, this, &FreeStimulatePage::onBtnIncreaseBClick);

    // B通道开始暂停
    connect(ui->btnStartStopB, &QPushButton::clicked, this, &FreeStimulatePage::onBtnStartStopBClick);

    // 参数设置按钮
    connect(ui->btnParams, &QPushButton::clicked, this, &FreeStimulatePage::onBtnParamsClick);

    // 返回按钮
    connect(ui->btnExit, &QPushButton::clicked, this, &FreeStimulatePage::onExit);

    // 接收串口数据
    connect(SerialManager::instance(), &SerialManager::dataReceived, this, &FreeStimulatePage::handleSerialData);
}

/**
 * @brief 页面显示事件
 * @param event
 */
void FreeStimulatePage::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);

    // 切换到空闲状态
    SerialManager::instance()->sendData(CommandHex::command_hex_free);
    qDebug() << "发送空闲状态命令：" << CommandHex::command_hex_free.toHex();

    // 延迟执行：切换到循环刺激状态
    QTimer::singleShot(100, this, [this](){
        SerialManager::instance()->sendData(CommandHex::command_hex_loop_stimulate);
        qDebug() << "发送循环刺激状态命令：" << CommandHex::command_hex_loop_stimulate.toHex();

        // 发送刺激参数
        sendStimulateParam();
    });
}

/**
 * 发送刺激参数
 * @brief FreeStimulatePage::sendStimulateParam
 */
void FreeStimulatePage::sendStimulateParam()
{
    qDebug() << "发送刺激参数命令：" << getStimulateParams();

    // 延迟执行：发送刺激参数
    QTimer::singleShot(100, this, [this](){
        SerialManager::instance()->sendData(StimulateHelper::loopStimulateParam(CommandHex::command_channel_a_param, getStimulateParams()));

        QTimer::singleShot(100, this, [this](){
            SerialManager::instance()->sendData(StimulateHelper::loopStimulateParam(CommandHex::command_channel_b_param, getStimulateParams()));
        });
    });
}


/** 处理串口数据
 * @brief FreeStimulatePage::handleSerialData
 * @param data
 */
void FreeStimulatePage::handleSerialData(const QByteArray &data)
{
    qDebug() << "FreeStimulate Receive Data: " << data.toHex(' ').toUpper();

    static QByteArray tempData;     // 临时存储完整数据帧
    static QByteArray surplusData;  // 不满一帧的剩余数据

    // static QByteArray

    // 如果有剩余数据，先拼接
    if (!surplusData.isEmpty()) {
        tempData = surplusData + data;
        surplusData.clear();
    } else {
        tempData = data;
    }

    // 当前要处理的数据长度
    int dataLen = tempData.size();
    const int frameLen = 15;        // 帧长度固定是15

    // 遍历所有的数据
    for (int i = 0; i < dataLen; i++) {

        // 检查帧头
        if (i + 1 < dataLen && static_cast<quint8>(tempData[i]) == 0x55 && static_cast<quint8>(tempData[i+1]) == 0xAA) {

            // 检查剩余数据是否够一帧
            if (dataLen - i >= frameLen) {
                QByteArray frame = tempData.mid(i, frameLen);

                // 创建带有初始大小的QVector
                QVector<int> temp(frameLen);
                for (int j = 0; j < frameLen; j++) {
                    temp[j] = static_cast<quint8>(frame[j]);
                }

                // 循环刺激进度帧
                if(temp[3] == 0x83) {
                    switch (temp[4]) { // A通道
                        case 0x00:  // 休息时间

                            break;
                        case 0x02:  // 刺激时间

                            break;
                        default:
                            break;
                    }

                    switch (temp(9)) { // B通道
                        case 0x00: // 休息时间

                            break;
                        default:
                            break;
                    }
                }

                i = i + frameLen - 1; // 跳过已处理的数据

            } else {
                surplusData = tempData.mid(i);
                break;
            }

        }
    }

}

/**
 * @brief A通道 减少电流
 */
void FreeStimulatePage::onBtnReduceAClick()
{
    if (m_currentA > 0){
        m_currentA--;
        updateCurrentDisplay();

        // 发送A通道电流调节状态命令
        SerialManager::instance()->sendData(CommandHex::command_hex_current_adjust_status_a);

        // 使用QTimer实现延迟，替代Thread.sleep
        QTimer::singleShot(100, this, [](){
            SerialManager::instance()->sendData(CommandHex::command_hex_current_down_a);
        });
    }
}

/**
 * @brief A通道 增加电流
 */
void FreeStimulatePage::onBtnIncreaseAClick()
{
    if (m_currentA < MAX_CURRENT) {
        m_currentA++;
        updateCurrentDisplay();

        // 发送A电流调节状态命令
        SerialManager::instance()->sendData(CommandHex::command_hex_current_adjust_status_a);

        // 使用QTimer实现延迟，替代Thread.sleep
        QTimer::singleShot(100, this, [](){
            SerialManager::instance()->sendData(CommandHex::command_hex_current_up_a);
        });
    }

}

/**
 * @brief B通道 减少电流
 */
void FreeStimulatePage::onBtnReduceBClick()
{
    if (m_currentB > 0) {
        m_currentB--;
        updateCurrentDisplay();

        // B通道电流状态调节命令
        SerialManager::instance()->sendData(CommandHex::command_hex_current_adjust_status_b);

        // B 通道电流下调
        QTimer::singleShot(100, this, []{
            SerialManager::instance()->sendData(CommandHex::command_current_down_b);
        });
    }
}

/**
 * @brief B通道 增加电流
 */
void FreeStimulatePage::onBtnIncreaseBClick()
{
    if (m_currentB < MAX_CURRENT) {
        m_currentB++;
        updateCurrentDisplay();

        // B通道电流状态调节命令
        SerialManager::instance()->sendData(CommandHex::command_hex_current_adjust_status_b);

        // B 通道电流上调
        QTimer::singleShot(100, this, []{
            SerialManager::instance()->sendData(CommandHex::command_current_up_b);
        });
    }
}

/**
 * @brief A通道的开始暂停
 */
void FreeStimulatePage::onBtnStartStopAClick()
{
    QString text = ui->btnStartStopA->text();

    if (text == "开始"){
        if (ui->labelCurrentA->text() == "0mA") {
            showToast("电流不能为0mA");
            return;
        }

        ui->btnStartStopA->setText("停止");

        SerialManager::instance()->sendData(CommandHex::command_start_work_a);

    } else if (text == "停止"){
        ui->btnStartStopA->setText("开始");

        SerialManager::instance()->sendData(CommandHex::command_stop_work_a);
    }


}

/**
 * @brief B 通道按钮的开始，停止
 */
void FreeStimulatePage::onBtnStartStopBClick()
{
    QString text = ui->btnStartStopB->text();

    if (text == "开始"){
        if (ui->labelCurrentB->text() == "0mA") {
            showToast("电流不能为0mA");
            return;
        }

        ui->btnStartStopB->setText("停止");

        SerialManager::instance()->sendData(CommandHex::command_start_work_b);
    } else if (text == "停止") {
        ui->btnStartStopB->setText("开始");

        SerialManager::instance()->sendData(CommandHex::command_stop_work_b);
    }
}

/**
 * @brief 更新电流显示
 */
void FreeStimulatePage::updateCurrentDisplay()
{
    ui->labelCurrentA->setText(QString::number(m_currentA) + "mA");
    ui->labelCurrentB->setText(QString::number(m_currentB) + "mA");
}

/**
 * @brief 获取刺激参数
 */
QByteArray FreeStimulatePage::getStimulateParams()
{
    QByteArray data(8,0);

    // 1. 频率参数 - 固定值80
    int param1 = static_cast<int>(80.0f * 2);
    data[0] = static_cast<char>((param1 & 0xFF00) >> 8); // 高字节
    data[1] = static_cast<char>(param1 & 0x00FF); // 低字节

    // 2. 脉冲宽度
    int param2 = static_cast<int>(200.f / 10);
    data[2] = static_cast<char>(param2);

    // 3. 放松时间
    int param3 = 1;
    data[3] = static_cast<char>(param3);

    // 4. 上升时间
    int param4 = static_cast<int>(1.0f * 2);
    data[4] = static_cast<char>(param4);

    // 5. 刺激时间
    int param5 = 1;
    data[5] = static_cast<char>(param5);

    // 6. 下降时间
    int param6 = static_cast<int>(1.0f * 2);
    data[6] = static_cast<char>(param6);

    // 7. 波形类型
    data[7] = 0x01;


    return data;
}

/**
 * 弹出提示框
 * @brief FreeStimulatePage::showToast
 * @param msg
 */
void FreeStimulatePage::showToast(const QString &msg)
{
    QMessageBox *toast = new QMessageBox(this);
    toast->setText(msg);
    toast->setStandardButtons(QMessageBox::NoButton);
    toast->show();

    // 自动关闭
    QTimer::singleShot(2000, toast, &QMessageBox::deleteLater);
}

/**
 * 参数设置按钮的点击
 * @brief FreeStimulatePage::onBtnParamsClick
 */
void FreeStimulatePage::onBtnParamsClick()
{
    emit requestToParamsPage();
}


/**
 * 退出
 */
void FreeStimulatePage::onExit()
{
    // 返回主页面
    emit requestBackToMainPage();
}

FreeStimulatePage::~FreeStimulatePage()
{
    delete ui;
}
